/*
 * Copyright (c) 2023. bmy
 */
import { GET, Mapper } from "@ann/http.annotation";
import { property, defaultValue, deserialize } from "@ann/JsonToClass";

// ajax接口数据返回 为 ResponseType[]
// 这里定义类，将 接口返回的数据 映射到 类中存储
export class ResponseType {
  // 接口返回数据的字段 为 id，这里映射改为 user_id，代码里面用 user_id
  @property("id")
  @defaultValue(0)
  user_id!: number;

  @property("name")
  @defaultValue("如果接口字段无数值，那这个参数就是默认值")
  user_name!: string
}

export class UserService {
  /**
   * 1 提供 四个【请求装饰器】：@GET @POST @PUT @DELETE
   * 参数说明：
   *   url 可选：接口请求短地址，如果不填默认使用 configure.config.ts 中和方法名IndexTest同名的对象key中地址
   *            如果传，使用你传的地址
   * 
   *   useHandle 可选：是否需要对网络请求的结果进行修改后再返回给页面，如果需要传 true，则请求方法的入参 params 会变为ajax请求
   *                  得到的接口数据，处理完数据后，请 return 结果。否则 IndexTest 代码内部留空，节省大量 冗余代码！！
   * 
   *   header 可选：自定义请求头，例如文件上传等 可以在这自定义
   * 
   * 2 @Mapper() 装饰器
   * 参数说明：
   *   请求方法的返回类型（必须用类来描述JSON数据类型），会被 Reflect.defineMetadata 注入 元数据，在 上一步
   *  【请求装饰器】结束请求后，会从 Reflect.getMetadata 取出 元数据，然后 被 JsonToClass 使用到。
   *   JsonToClass 会将json数据映射到 @Mapper() 装饰器的 参数中，也就是 json数据自动存储到类属性中
   */
  @GET()
  @Mapper(ResponseType)
  // @ts-ignore
  public async UserList (params: object | ResponseType[]): Promise<ResponseType[]> {
    // 留空，不要写请求代码 即可发送请求，除非 useHandle: true，这时 方法入参  params 为 ajax 接口数据，直接处理 params
    // 即可，也不需要写请求代码！！
  }
  
}
